#ifndef STACK_H
#define STACK_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

typedef struct {
    void* data;          // 存储元素的数组
    size_t element_size; // 每个元素的大小（字节）
    int capacity;        // 栈的总容量
    int top;             // 栈顶指针
    /*
   时间：2025.03.25
   作者：zdw
   函数名：is_empty
   作用：判断栈是否为空
   参数说明：self操作对象
   */ 
    bool (*is_empty)(void* self);
    /*
   时间：2025.03.25
   作者：zdw
   函数名：is_full
   作用：判断栈是否满
   参数说明：self操作对象
   */ 
    bool (*is_full)(void* self);
    /*
   时间：2025.03.25
   作者：zdw
   函数名：push
   作用：将数据添加到栈中
   参数说明：self操作对象，element添加的数据
   */ 
    bool (*push)(void* self, const void* element);
    /*
   时间：2025.03.25
   作者：zdw
   函数名：pop
   作用：删除栈顶元素
   参数说明：self操作对象
   */ 
    bool (*pop)(void* self);
    /*
   时间：2025.03.25
   作者：zdw
   函数名：back
   作用：获取栈顶元素
   参数说明：self操作对象
   */ 
    void* (*back)(void* self);
    /*
   时间：2025.03.19
   作者：zdw
   函数名：clear
   作用：删除容器
   参数说明：self操作对象
   */ 
    void (*clear)(void* self);
} Stack;
/*
时间：2025.03.19
作者：zdw
函数名：stack
作用：创建栈
参数说明：element_size元素类型大小
*/ 
Stack* stack(size_t element_size);
#endif